import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_house_manager/api/user.dart';
import 'package:flutter_house_manager/controller/UserInfoController.dart';
import 'package:flutter_house_manager/utils/CameraDialog.dart';
import 'package:flutter_house_manager/utils/PromptAction.dart';

import 'package:image_picker/image_picker.dart';
import 'package:get/get.dart'
    hide FormData, MultipartFile; // 隐藏Get包中的FormData和MultipartFile
import 'package:dio/dio.dart'; // 使用dio包中的FormData和MultipartFile

class ProfilePage extends StatefulWidget {
  const ProfilePage({super.key});

  @override
  State<ProfilePage> createState() => _ProfilePageState();
}

class _ProfilePageState extends State<ProfilePage> {
  UserInfoController controller = Get.find();

  TextEditingController nickController = TextEditingController();

  String tempAvatar = ""; // 用来临时存储头像的变量
  String tempFileName = ""; // 用来临时存储头像的文件名称

  Widget getUserAvatar() {
    if (!tempAvatar.isEmpty) {
      // web场景下是network
      // 鸿蒙安卓 相册路径 file://
      if (kIsWeb) {
        return Image.network(
          tempAvatar,
          width: 30,
          height: 30,
        );
      }
      // 除了web平台 都采用file图片的形式
      return Image.file(
        File(tempAvatar),
        width: 30,
        height: 30,
      );
    }

    if (controller.userInfo["avatar"] != null &&
        controller.userInfo["avatar"] != "") {
      return Image.network(
        controller.userInfo["avatar"],
        width: 30,
        height: 30,
      );
    }
    return Image.asset(
      'assets/images/avatar_1.jpg',
      width: 30,
      height: 30,
    );
  }

  @override
  initState() {
    super.initState();
    nickController.text = controller.userInfo["nickName"] ?? "";
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    // nickController.text = controller.userInfo["nickname"];
  }

  @override
  void didUpdateWidget(covariant ProfilePage oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
  }

  // 保存用户信息
  _saveUserInfo() async {
    if (nickController.text.isEmpty) {
      PromptAction.showWarning("用户昵称不能为空");
      return;
    }
    if (!RegExp(r'^[\u4e00-\u9fa5]{2,10}').hasMatch(nickController.text)) {
      PromptAction.showWarning("昵称必须是2-10个中文字符");
      return;
    }
    var avatar = controller.userInfo["avatar"] ?? ""; // 原来的地址
    // 判断是否需要上传头像 上传完头像再进行保存用户信息 拿到上传的地址 =》 保存接口 存储到用户的头像上
    if (!tempAvatar.isEmpty) {
      FormData? data;
      // 要进行上传
      if (kIsWeb) {
        Uint8List list = await XFile(tempAvatar).readAsBytes(); // 读取二进制
        // 要得到file对象
        MultipartFile file =
            MultipartFile.fromBytes(list, filename: tempFileName);
        data = FormData.fromMap(
            {"file": file, "type": 'avatar'}); // 得到formData类型要进行上传
      } else {
        // 鸿蒙端的formData
        data = FormData.fromMap(
            {"file": MultipartFile.fromFileSync(tempAvatar), "type": 'avatar'});
      }

      final res = await uploadPhotoAPI(data);
      avatar = res["url"]; // 上传成功的地址
    }

    await updateUserInfoAPI({
      "nickName": nickController.text,
      "avatar": avatar,
    });
    // 认为任务已经完成啦
    tempAvatar = "";
    tempFileName = "";
    // controller 此时共享需要更新

    // 提示一下
    PromptAction.showSuccess("用户资料保存成功");
    controller.userInfo["nickName"] = nickController.text; // 更新对象里面的属性
    controller.userInfo["avatar"] = avatar; // 更新对象里面的属性
    controller.updateUserInfo(controller.userInfo); // 通过Getx的更新方法驱动页面进行更新
  }

  // 打开项目
  openLibrary() async {
    // 1. 实例化一个ImagePicker
    ImagePicker picker = ImagePicker();
    XFile? file = await picker.pickImage(source: ImageSource.gallery);
    if (file != null) {
      // PromptAction.showSuccess("选择照片成功");
      // file.path // 路径 web-blob路径-二进制路径
      tempAvatar = file.path; // 记录文件路径
      tempFileName = file.name; // 记录文件名称

      setState(() {});
      Navigator.pop(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<UserInfoController>(builder: (ctr) {
      return Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: const Text('个人信息'),
          backgroundColor: Colors.transparent,
          centerTitle: true,
        ),
        body: ListView(
          padding: const EdgeInsets.all(10),
          children: [
            GestureDetector(
              onTap: () {
                // 弹出层
                showCameraDialog(context, onLibrary: () {
                  openLibrary();
                });
              },
              child: SizedBox(
                height: 50,
                child: Row(
                  children: [
                    const Text(
                      '头像',
                      style: TextStyle(fontSize: 16),
                    ),
                    const Spacer(),
                    Row(
                      children: [
                        ClipRRect(
                          borderRadius: BorderRadius.circular(50.0),
                          child: getUserAvatar(),
                        ),
                        const Icon(Icons.arrow_forward_ios, size: 12)
                      ],
                    )
                  ],
                ),
              ),
            ),
            Row(
              children: [
                const Text('昵称'),
                const Spacer(),
                Expanded(
                  child: TextField(
                    controller: nickController,
                    decoration: const InputDecoration(
                      hintText: '请输入昵称',
                      border: InputBorder.none,
                    ),
                    textAlign: TextAlign.right,
                  ),
                ),
                const Icon(Icons.arrow_forward_ios, size: 12)
              ],
            ),
            const SizedBox(
              height: 20,
            ),
            Row(
              children: [
                Expanded(
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(
                      backgroundColor: const Color.fromARGB(255, 85, 145, 175),
                      minimumSize: const Size(100, 50),
                    ),
                    onPressed: () {
                      _saveUserInfo();
                    },
                    child: const Text(
                      '保存',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20,
                      ),
                    ),
                  ),
                )
              ],
            )
          ],
        ),
      );
    });
  }
}
